/**
 * 
 * 智能成绩表
 * 
 * 题目描述

小明来到某学校当老师，需要将学生按考试总分或单科分数进行排名，你能帮帮他吗？

输入描述
第 1 行输入两个整数，学生人数 n 和科目数量 m。

0 < n < 100
0 < m < 10
第 2 行输入 m 个科目名称，彼此之间用空格隔开。

科目名称只由英文字母构成，单个长度不超过10个字符。
科目的出现顺序和后续输入的学生成绩一一对应。
不会出现重复的科目名称。
第 3 行开始的 n 行，每行包含一个学生的姓名和该生 m 个科目的成绩（空格隔开）

学生不会重名。
学生姓名只由英文字母构成，长度不超过10个字符。
成绩是0~100的整数，依次对应第2行种输入的科目。
第n+2行，输入用作排名的科目名称。若科目不存在，则按总分进行排序。

输出描述
输出一行，按成绩排序后的学生名字，空格隔开。成绩相同的按照学生姓名字典顺序排序。

用例
输入	3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue
输出	xiaohua fangfang minmin
说明	按shuxue成绩排名，依次是xiaohua、fangfang、minmin
输入	3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
输出	fangfang minmin xiaohua
说明	排序科目不存在，按总分排序，fangfang和minmin总分相同，按姓名的字典顺序，fangfang排在前面

 * 
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.StringJoiner;

/**
 * 
 * 
 * 题目解析
本题是一道排序题。难度在于排序规则是动态的，不是固定的。

本题要求按照最后一行输入的科目的分数进行排序，如果对应科目不存在，则按照总分进行排序。



如果排序要素值相同（可能是某科成绩，可能是总分），那么就再按照学生姓名的字典序排序。
 * 
 */
public class 智能成绩表 {

    public static void main(String[] args) {
        
        try{

            Scanner scanner = new Scanner(System.in);

            //学生人数
            int StuCount = scanner.nextInt();
            //科目数量
            int courseCount = scanner.nextInt();

            //保存科目和下标，便于检索检索条件
            Map<String, Integer> courseMap = new HashMap<>();

            for(int i=0; i<courseCount; i++){

                courseMap.put(scanner.next(), i);
            }

            //学生和成绩数组
            List<StudentInfo> stuScoreArr = new ArrayList<>(StuCount);
            
            for(int i=0; i<StuCount; i++){

                String name = scanner.next();
                int[] scoreArr = new int[courseCount];
                for(int j=0; j<courseCount; j++){
                    scoreArr[j] = scanner.nextInt();
                }
                stuScoreArr.add(new StudentInfo(name, scoreArr, Arrays.stream(scoreArr).reduce(0, Integer::sum)));
            }

            String condition = scanner.next();

            //判断条件是否命中

            StringJoiner stringJoiner = new StringJoiner(" ");

            if(!courseMap.containsKey(condition)){
                //按总分排序
                stuScoreArr.sort((a, b) -> 
                (a.total != b.total) ? b.total - a.total : a.name.compareTo(b.name));

                stuScoreArr.forEach(s -> stringJoiner.add(s.name));

            } else {

                int position = courseMap.get(condition);

                //按科目排
                stuScoreArr.sort((a, b) -> 
                (a.score[position] != b.score[position]) ? b.score[position] - a.score[position] : a.name.compareTo(b.name));

                stuScoreArr.forEach(s -> stringJoiner.add(s.name));

            }

            System.out.println(stringJoiner.toString());


        } catch(Exception e){
            e.printStackTrace();
            System.out.println("程序异常"+(null == e ?"":e.getMessage()));
        }

    }

    public static class StudentInfo {

        public String name;
        public int[] score;
        public int total;
        
        public StudentInfo(String name, int[] score, int total){

            this.name = name;
            this.score = score;
            this.total = total;
        }
    }
}